/**********************************************/
/*   Modal Dialog cross broswer               */
/*--------------------------------------------*/
/*   Par MaX3315                              */
/*   http://codessources.votre-web.com        */
/**********************************************/


///function: myShowModalDialog(url,mode,reference)
//  arguments:
//   -url : url to open in the popup
//   -mode : innerHTML | value | function | functionRef | style.<JS_style_property>
//   -reference :
//    	avec le mode 'innerHTML' ou 'value' il s'agit de l'id de l'element dans
//    	le DOM qu'il faudra mettre à jour
//    	en mode 'function' il s'agit du nom de la fonction sous forme de chaine
//      alors qu'avec 'functionRef' il s'agit de la function elle même (pointeur)
//   -windowParam: troisiement argument de window.open
function newShowModalDialog(url,mode,reference,windowParam)
{
	var winOpenned=MODAL_alreadyOpen(mode,reference);
	if(winOpenned!=null) { winOpenned.focus(); return; }
	var id=MODAL_DIALOG_LIST.length;
	var newWin=window.open(url,'modal_'+id,windowParam);
	MODAL_DIALOG_LIST.push(Array(newWin,mode,reference,true));  //format win, mode, referecene , isOpen
}

//Fonction que doit appeler la fenetre modale pour mettre transmettre la nouvelel valeur
// Exemple de code a placer dans votre fenetre modale :
//   window.opener.modalCallBackFunction(window.self,'MA VALEUR');
function modalCallBackFunction(winRef,newValue)
{
	if(newValue==null) { return; } //pas de valeur renvoyé
	
  	var modalObj=MODAL_findModalByWinRef(winRef);
	if(MODAL_findModalByWinRef==null)  //impossible de trouver la modal correspondante
	{
		alert('Error : unable to found window reference for callBack procedure.');
	}
	else
	{
		var modeList=Array();
		modeList=modalObj[1].split('|');
		for(var i=0 ; i<modeList.length ; i++)
		{
			switch(modeList[i])
			{
				case 'innerHTML' :
					var tmp=document.getElementById(modalObj[2]);
					if(tmp) { tmp.innerHTML=newValue; }
					break;
				case 'value' :
					var tmp=document.getElementById(modalObj[2]);
					if(tmp) { tmp.value=newValue; }
					break;
				case 'function' :
					eval(modalObj[2]+'(\''+newValue+'\')');
					break;
				case 'functionRef' :
					modalObj[2](newValue);
					break;
				default :
					if(modeList[i].indexOf('style.')==0)  //exemple style.backgroundColor
					{
						//ATTENTION newValue doit être correctement formatte,
						//a vous de faire en sorte que votre fenetre modale renvoie la bonne valeur avec le bon formatage
						// exemeple qu'une couleur soit au format '#ff0033' ou rgb(255,0,85) etc...
						try
						{
							eval('document.getElementById(\''+modalObj[2]+'\').'+modeList[i]+'=\''+newValue+'\';');
						} catch(e) { ; }
					}
					break;
			}
		}
	}
}

//---- Inutile de regarder plus bas, seul la fonction newShowModalDialog est a appeler pour construire  une fenetre modal --//

// Variables globales du script
var MODAL_DIALOG_LIST=Array();

//méthode globales du script
function MODAL_alreadyOpen(mode,reference)
{
	for(var i=0 ; i<MODAL_DIALOG_LIST.length ; i++)
	{
		if(MODAL_DIALOG_LIST[i][1]==mode && MODAL_DIALOG_LIST[i][2]==reference && MODAL_DIALOG_LIST[i][3])
		{
		  //on test si elle est encore ouverte
		  if(MODAL_DIALOG_LIST[i][0].document) { return MODAL_DIALOG_LIST[i][0]; }
		  else   //la fenetre a été fermée sans qu'elle est pu prevenir la fenetre mere, on corrige donc le flag isOpen
		  {
		  	MODAL_DIALOG_LIST[i][3]=false;
		  }
		}
	}
	return null;
}

function MODAL_findModalByWinRef(winRef)
{
	for(var i=0 ; i<MODAL_DIALOG_LIST.length ; i++)
	{
		if(MODAL_DIALOG_LIST[i][0]==winRef && MODAL_DIALOG_LIST[i][3])
		{
		  //on test si elle est encore ouverte
		  if(MODAL_DIALOG_LIST[i][0].document) { return MODAL_DIALOG_LIST[i]; }
		  else   //la fenetre a été fermée sans qu'elle est pu prevenir la fenetre mere, on corrige donc le flag isOpen
		  {
		  	MODAL_DIALOG_LIST[i][3]=false;
		  }
		}
	}
	return null;
}

//force le focus sur les modal encore ouverte (en thoerie il ne peut y en avoir qu'une seule encore d'ouverte)
function MODAL_forceFocusOnModal()
{
	for(var i=0 ; i<MODAL_DIALOG_LIST.length ; i++)
	{
		if(MODAL_DIALOG_LIST[i][3] && MODAL_DIALOG_LIST[i][0].document) { MODAL_DIALOG_LIST[i][0].focus(); }
	}
	return;
}

//ajout d'un handler sur la reprise du focus, permettant d'imediatement redonner le focus a une eventuelle modal encore ouverte
if (document.addEventListener) { document.addEventListener("focus", MODAL_forceFocusOnModal, true); }
else if (document.attachEvent) { document.attachEvent("onfocus", MODAL_forceFocusOnModal); }


